【STM32】STM32内部flash编程和擦除

您所在的位置:网站首页 l have a eraser是什么意思 【STM32】STM32内部flash编程和擦除

【STM32】STM32内部flash编程和擦除

2024-07-10 02:59| 来源: 网络整理| 查看: 265

一直在想设计OTA方案,使用开源的软件工具实现OTA,因为涉及较多,暂未完成。。。

关于OTA设计,可以先参考IAP:【IAP】IAP在线升级流程,涉及对芯片BootLoader和flash操作;升级数据下发又涉及使用哪种网络协议等,还有等等。。。言归正传。

对不同芯片的flash的操作不太相同,也有类似的地方。STM32L43xx系列:每页2k数据,单bank。

STM32G4系列:双bank ,每个bank 128页。

所以在设计时要对内部flash(暂时不说外部flash)正确划分、操作, 认真查看手册,官方例程。他们才是最熟悉芯片。

 擦除结构体:

参数1:选择哪种擦除方式

参数2:擦除所在bank区

参数3:擦除页(从多少页开始擦除)

参数4:擦除多少页

typedef struct { uint32_t TypeErase; /*!< Mass erase or page erase. This parameter can be a value of @ref FLASH_Type_Erase */ uint32_t Banks; /*!< Select bank to erase. This parameter must be a value of @ref FLASH_Banks (FLASH_BANK_BOTH should be used only for mass erase) */ uint32_t Page; /*!< Initial Flash page to erase when page erase is disabled. This parameter must be a value between 0 and (max number of pages in the bank - 1) (eg : 127 for 512KB dual bank) */ uint32_t NbPages; /*!< Number of pages to be erased. This parameter must be a value between 1 and (max number of pages in the bank - value of initial page)*/ } FLASH_EraseInitTypeDef;

这两个函数很重要。。。获得地址所在页,获得地址所在bank 。

static uint32_t GetPage(uint32_t Addr) { uint32_t page = 0; if (Addr < (FLASH_BASE + FLASH_BANK_SIZE)) { /* Bank 1 */ page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE; } else { /* Bank 2 */ page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE; } return page; } /** * @brief Gets the bank of a given address * @param Addr: Address of the FLASH Memory * @retval The bank of a given address */ static uint32_t GetBank(uint32_t Addr) { return FLASH_BANK_1; }

擦数据函数: 

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { }

向flash中写入数据:双字写64位数据。

if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, DATA_64) == HAL_OK) { Address = Address + 8; /* increment to next double word*/ 1地址,1字节数据 }

flash中数据: 

 

while (Address < FLASH_USER_END_ADDR) { data32 = *(__IO uint32_t *)Address; if (data32 != DATA_32) { MemoryProgramStatus++; } Address = Address + 4; } 单字读数据

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3